"""
@Project ：python
@File    ：05-其他内置方法.py
@IDE     ：PyCharm
@Author  ：DongCha
@Date    ：2024/4/10 010 19:46
"""


# 上文中学习的 __init__ 构造方法，是Python类 内置方法 之一
# 这些内置的类方法，各有各的特殊功能，被称之为：魔术方法


# __str__：字符串方法：
# 当直接输出类对象时，会输出类对象的内存地址
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age


s1 = Student("DongCha", 12)
print(s1)  # <__main__.Student object at 0x000001566FA87620>


# 通过 __str__ 方法，控制类转换为字符串的行为
class StudentWithStr:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'name: {self.name}, age: {self.age}'


s2 = StudentWithStr("DongCha", 13)
print(s2)  # name: DongCha, age: 13


# __lt__：小于符号比较方法：
# 直接对两个对象进行比较是不可以的，但是在类中实现 __lt__ 方法，即可同时完成 小于符号和大于符号 两种比较
class StudentWithLt:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        return self.age < other.age


s3 = StudentWithLt("DongCha", 11)
s4 = StudentWithLt("aaa", 15)
print(s3 < s4)  # True
print(s3 > s4)  # False


# __le__：可用于：<= >=两种运算
class StudentWithLe:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __le__(self, other):
        return self.age <= other.age


s5 = StudentWithLe("DongCha", 15)
s6 = StudentWithLe("DongCha", 18)
s7 = StudentWithLe("DongCha", 15)
print(s5 <= s6)  # True
print(s5 >= s6)  # False
print(s5 <= s7)  # True


# __eq__：可用于 == !=
# 不实现 __eq__ 方法，比较的是两个对象的内存地址，不同的两个对象必定是 False
# 实现 __eq__ 方法，可以在自定义比较是否相等
class StudentWithEq:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.age == other.age


s8 = StudentWithEq("DongCha", 15)
s9 = StudentWithEq("DongCha", 15)
print(s8 == s9)  # True
print(s8 != s9)  # False
